﻿using I3.AgenteIA.Dominio.Gramatica;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using Moq;
using System.Collections.Generic;

namespace I3.AgenteIA.Dominio.Teste
{
    [TestClass()]
    public class AnalisadorMorfologicoServicoTest
    {
        /// <summary>
        /// Armazena os finalizadores usados no teste
        /// </summary>
        private IEnumerable<Sinal> finalizadores = new Sinal[] { 
                new Sinal(".") { EhFinalizador = false }, 
                new Sinal("!") { EhFinalizador = false },
                new Sinal("?") { EhFinalizador = false } };

        [TestMethod()]
        public void RealizarAnaliseTest_Caso0()
        {
            // Declara as variaveis auxiliares do teste
            var texto = "!";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }

        [TestMethod()]
        public void RealizarAnaliseTest_Caso1()
        {
            // Declara as variaveis auxiliares do teste
            var texto = "Simples";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }

        [TestMethod()]
        public void RealizarAnaliseTest_Caso2()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "simples!";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }

        [TestMethod()]
        public void RealizarAnaliseTest_Caso3()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "simples!!!";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }

        [TestMethod()]
        public void RealizarAnaliseTest_Caso4()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "frase composta";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }
        
        [TestMethod()]
        public void RealizarAnaliseTest_Caso5()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "frase composta?";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }

        [TestMethod()]
        public void RealizarAnaliseTest_Caso6()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "frase composta???";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }
        
        [TestMethod()]
        public void RealizarAnaliseTest_Caso7()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "frase composta? claro que é";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }

        [TestMethod()]
        public void RealizarAnaliseTest_Caso8()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "frase composta? claro que é!";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }

        [TestMethod()]
        public void RealizarAnaliseTest_Caso9()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "frase composta? claro que é!!!";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }

        [TestMethod()]
        public void RealizarAnaliseTest_Caso10()
        {
            // Declara as variaveis auxiliares do teste
            string texto = "frase composta??? claro que é!!!";
            var oracao = new Mock<Oracao>();
            Sentenca[] sentencas = new Sentenca[] { new Sentenca(oracao.Object, texto) };

            RealizarAnalise_Execucao(texto, sentencas);
        }
        
        private void RealizarAnalise_Execucao(string texto, Sentenca[] sentencas)
        {
            // Declara as variaveis auxiliares do teste
            

            // Declara os objetos mock do teste
            var sentencaFactory = new Mock<SentencaInterpreter>();
            var elementoFactory = new Mock<ElementoInterpreter>();
            var oracao = new Mock<Oracao>();

            // Configura a execução dos métodos mock
            sentencaFactory.Setup(o => o.Interpretar(oracao.Object)).Returns(sentencas);
            oracao.SetupGet(o => o.Texto).Returns(texto);

            // Realizada a execução do teste
            AnalisadorMorfologicoServico servico = new AnalisadorMorfologicoServico(sentencaFactory.Object, elementoFactory.Object);
            servico.RealizarAnalise(oracao.Object);

            // Realiza os assets dos objetos mocks e variaveis
            sentencaFactory.Verify(o => o.Interpretar(oracao.Object), Times.Once());
        }
    }
}
